from django.contrib.auth.models import User
from django.db import models

from utils.ModelMixin import ModelSetMixin, DataTimeModelMixin


# Create your models here.
class Classification(ModelSetMixin):
    name = models.CharField(max_length=40,verbose_name='分类名')
    parent = models.ForeignKey('self',on_delete=models.SET_NULL,verbose_name='父级分类',null=True,blank=True)

    class Meta:
        verbose_name = '商品分类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class Commodity(ModelSetMixin):
    STATUS_CHOICES = (
        (0, '未发布'),
        (1, '发布'),
    )
    name = models.CharField(max_length=40, verbose_name='商品名')
    caption = models.CharField(max_length=140, verbose_name='副标题')
    brand = models.CharField(max_length=40, verbose_name='品牌')
    # Decimal做高精度计算 max_digits最大位数 decimal_places小数位数
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='单价')
    stock = models.IntegerField(verbose_name='库存')
    pack = models.TextField(verbose_name='包装信息')
    detail = models.TextField(verbose_name='详情', null=True, blank=True)
    serviceafter_sale = models.TextField(verbose_name='售后服务', null=True, blank=True)
    status = models.IntegerField(verbose_name='状态', default=0, choices=STATUS_CHOICES)
    classification1 = models.ForeignKey(Classification, on_delete=models.PROTECT, verbose_name='一级分类',
                                        related_name='classification1')
    classification2 = models.ForeignKey(Classification, on_delete=models.PROTECT, verbose_name='二级分类',
                                        related_name='classification2')
    comment = models.IntegerField(verbose_name='评价数量', default=0)
    sales = models.IntegerField(verbose_name='销量', default=0)

    class Meta:
        ordering = ['-sales','-comment','-create_time']
        verbose_name = '商品'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class CommodityImg(models.Model):   #商品图片 一(商品)对多(图片)
    src = models.TextField(verbose_name='商品图片')
    priority = models.IntegerField(default=0,verbose_name='优先级')
    commodity = models.ForeignKey(Commodity,on_delete=models.CASCADE,verbose_name='商品')

    class Meta:
        ordering = ['-priority']
        verbose_name = '商品'
        verbose_name_plural = verbose_name

class ShoppingCart(DataTimeModelMixin):
    # 一个商品就是一个购物车
    number = models.IntegerField(default=1,verbose_name='数量')
    commodity = models.ForeignKey(Commodity,on_delete=models.CASCADE,verbose_name='商品')
    user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='收货人')

    class Meta:
        ordering = ['-update_time']
        verbose_name = '购物车'
        verbose_name_plural = verbose_name

class Order(DataTimeModelMixin):    # 订单表
    PAY_METHOD_CHOICES = (
        (1,'支付宝'),
        (2,'货到付款')
    )
    STATUS_CHOICES=(
        (1,'待支付'),
        (2,'待发货'),
        (3,'待收获'),
        (4,'待评价'),
        (5,'已完成'),
        (6,'已取消'),
    )

    order_id = models.CharField(max_length=64,primary_key=True,verbose_name='订单号')
    total_count = models.IntegerField(default=1,verbose_name='商品数量')
    total_amount = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='商品总金额')
    pay_method = models.IntegerField(verbose_name='支付方式',default=1,choices=PAY_METHOD_CHOICES)
    status = models.IntegerField(verbose_name='订单状态',default=1,choices=STATUS_CHOICES)
    address = models.TextField(verbose_name='收获地址')
    user = models.ForeignKey(User,on_delete=models.PROTECT,verbose_name='用户')   #当 被关联的对象被删除时,当前表中的外键引用不能被删除

    class Meta:
        ordering = ['-update_time']
        verbose_name = '订单表'
        verbose_name_plural = verbose_name

class OrderGoods(DataTimeModelMixin):
    SCORE_CHOICES = (
        (0,'零星'),
        (1,'一星'),
        (2,'二星'),
        (3,'三星'),
        (4,'四星'),
        (5,'五星'),
    )
    number = models.IntegerField(default=1,verbose_name='商品数量')
    price = models.DecimalField(max_digits=10,decimal_places=2,verbose_name='单价')
    comment = models.TextField(verbose_name='评价', null=True, blank=True)
    score = models.IntegerField(verbose_name='评分',null=True, blank=True,choices=SCORE_CHOICES)
    is_anonymous = models.BooleanField(default=False,verbose_name='匿名评分')
    order = models.ForeignKey(Order,verbose_name='订单',on_delete=models.CASCADE)
    commodity = models.ForeignKey(Commodity,verbose_name='商品',on_delete=models.SET_NULL,null=True,blank=True)

    class Meta:
        ordering = ['-create_time']
        verbose_name = '支付信息'
        verbose_name_plural = verbose_name

class Payment(DataTimeModelMixin):
    trade_id = models.CharField(max_length=100,unique=True,verbose_name='支付宝交易号')
    order = models.ForeignKey(Order,on_delete=models.CASCADE,verbose_name='订单')

    class Meta:
        ordering = ['-create_time']
        verbose_name = '支付信息'
        verbose_name_plural = verbose_name
